static int talk_to_otherend(struct xenbus_device *dev)
{
struct xenbus_driver *drv = to_xenbus_driver(dev->dev.driver);
- int err;
free_otherend_watch(dev);
free_otherend_details(dev);
- err = drv->read_otherend_details(dev);
- if (err)
- return err;
+ return drv->read_otherend_details(dev);
+}
+
+static int watch_otherend(struct xenbus_device *dev)
+{
return xenbus_watch_path2(dev, dev->otherend, "state",
&dev->otherend_watch, otherend_changed);
}
goto fail;
}
+ err = talk_to_otherend(dev);
+ if (err) {
+ printk(KERN_WARNING
+ "xenbus_probe: talk_to_otherend on %s failed.\n",
+ dev->nodename);
+ return err;
+ }
+
err = drv->probe(dev, id);
if (err)
goto fail;
- err = talk_to_otherend(dev);
+ err = watch_otherend(dev);
if (err) {
printk(KERN_WARNING
- "xenbus_probe: talk_to_otherend on %s failed.\n",
+ "xenbus_probe: watch_otherend on %s failed.\n",
dev->nodename);
return err;
}
return err;
}
+ err = watch_otherend(xdev);
+ if (err) {
+ printk(KERN_WARNING
+ "xenbus_probe: resume (watch_otherend) %s failed: "
+ "%d.\n", dev->bus_id, err);
+ return err;
+ }
+
if (drv->resume)
err = drv->resume(xdev);
if (err)